/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.clyme.expediente.controlador;


import com.clyme.expediente.entidad.Perfil;
import com.clyme.expediente.entidad.Usuario;
import com.clyme.expediente.servicios.UsuarioServicio;
import com.clyme.expediente.utilitarios.Utilitario;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
@ManagedBean(name = "usuarioControlador")
@ViewScoped
public class UsuarioControlador implements Serializable{
    
    String nickTemporal = "";
    Usuario usuario;
    Perfil perfil;
    UsuarioServicio usuarioServicio;
    List<Perfil> perfiles;
    List<Usuario> usuarios;
    @ManagedProperty("#{sesionControlador}")
    SesionControlador sesionControlador;
    
    public UsuarioControlador() {
        
    }
    
    public void initRegistro()
    {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            usuario = new Usuario();
            perfil = new Perfil();
            usuarioServicio = new UsuarioServicio();
            perfiles = usuarioServicio.obtenerPerfiles();
        }
    }
    
    public void initLista(){
        if (!FacesContext.getCurrentInstance().isPostback()) {
//            sesionControlador.generarModulo(2);/** NUMERO MAGICO T_T **/
            usuarioServicio = new UsuarioServicio();
            usuarios = usuarioServicio.obtenerUsuarios();
//            usuarios = new Paginador<Usuario>(new UsuarioPaginator());
        }
    }
    
    public void initUpdate()
    {
        if(!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idUsuario");
            if (parametro == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(),"/views/usuario/list.xhtml");
                return;
            }
            perfil = new Perfil();
            usuarioServicio = new UsuarioServicio();
            usuario = usuarioServicio.obtenerUsuarioPorId((Integer) parametro);
            perfil.setId(usuario.getPerfil().getId());
            perfiles = usuarioServicio.obtenerPerfiles();
            nickTemporal = usuario.getNick();
        }
    }
    
    public void registrarUsuario(){
        if(!esVistaValida())
        {
            return;
        }
        if(!usuarioServicio.esValido(usuario,nickTemporal)){
            return;
        }
        usuario.setPerfil(perfil);
        usuarioServicio.registrarUsuario(usuario);
        limpiar();
    }
    
    public void actualizar()
    {
        if(!esVistaValida() || !usuarioServicio.esValido(usuario,nickTemporal)){
            return;
        }
        usuario.setPerfil(perfil);
        usuarioServicio.actualizarUsuario(usuario);
        nickTemporal = usuario.getNick();
    }
    
    public String irActualizar(int id)
    {
        Utilitario.putFlash("idUsuario", id);
        return "update.xhtml?faces-redirect=true";
    }
    
    public void eliminar(){
        
    }
    
    private void limpiar()
    {
        usuario = new Usuario();
        perfil.setId(0);
    }
    
    /** VALIDACIONES    **/
    
    private boolean esVistaValida(){
        boolean resultado = true;
        if(!esNickValido()){
            resultado = false;
        }else if(!esPasswordValido()){
            resultado = false;
        }else if(!esPerfilValido()){
            resultado = false;
        }
        return resultado;
    }
    
    private boolean esNickValido(){
        boolean resultado = true;
        if(!Utilitario.esNulo(nickTemporal) && nickTemporal.equals(usuario.getNick())){
            resultado = true;
        }else if(Utilitario.esNulo(usuario.getNick().trim())){
            Utilitario.enviarMensajeGlobalError("Debe ingresarse el usuario");
            resultado = false;
        }else if(!Utilitario.esRangoValido(usuario.getNick(),20)){
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres de usuario es 20");
            resultado = false;
        }else if(!Utilitario.esSoloLetras(usuario.getNick())){
            Utilitario.enviarMensajeGlobalError("Solo se permite letras en usuario");
            resultado = false;
        }
        return resultado;
    }
    
    private boolean esPasswordValido(){
        boolean resultado = true;
        if(Utilitario.esNulo(usuario.getClave().trim())){
            Utilitario.enviarMensajeGlobalError("Debe ingresarse la clave");
            resultado = false;
        }else if(!Utilitario.esRangoValido(usuario.getClave(),20)){
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres de la clave es 20");
            resultado = false;
        }else if(!Utilitario.esAlfaNumerico(usuario.getClave())){
            Utilitario.enviarMensajeGlobalError("Solo se permiten caracteres alfanumericos en la clave");
            resultado = false;
        }
        return  resultado;
    }
    
    private boolean esPerfilValido()
    {
        boolean resultado = true;
        if(perfil.getId().intValue() == 0){
            Utilitario.enviarMensajeGlobalError("Debe seleccionar un Perfil");
            resultado = false;
        }
        return resultado;
    }
    
    /** GETERS AND SETTERS
     * @return  **/
    
    
    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    
    

    public void setSesionControlador(SesionControlador sesionControlador) {
        this.sesionControlador = sesionControlador;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Perfil getPerfil() {
        return perfil;
    }

    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }

    public List<Perfil> getPerfiles() {
        return perfiles;
    }

    public void setPerfiles(List<Perfil> perfiles) {
        this.perfiles = perfiles;
    }
    
    
    
    
    
    
}
